package com.cskaoyan.javase.array._6var;

/**
 * @description: 可变参数
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 *
 * 为了不实现不确定个数形参的方法,我们需要使用可变参数
 * 语法:
 *  [修饰符列表] 返回值类型 方法名 (形式参数列表,数据类型... 变量名){
 * 	//方法体
 * }
 * 可变参数的实质是数组,比如int... a就是一个int数组
 * 注意事项:
 *      1,像可变参数这样,实现原理不变,但是底层编译器或者jvm帮助我们完成了一些操作,从而简化程序员的操作
 *      这种语法我们称之为"语法糖"
 *      2,可变参数用于形参列表中，并且只能出现在形参列表的最后面,前面或者中间都是不行的
 *      3,可变参数只能有一个,一个方法不能有两个可变参数
 *      4,可变参数是可以参与方法重载的,因为它本质是数组,构成方法重载后,方法的调用仍然遵循就近原则
 *      比如如果有确定个数的方法匹配,优先确定个数的
 *      4,构成方法重载的可变参数方法的使用要小心谨慎,因为很容易导致两个方法都不可用
 *      5,可变参数的三个点位于数据类型和变量名之间，前后有无空格都可以
 * - 最好是前无空格，后有空格
 *
 */
public class Demo {
    public static void main(String[] args) {
        /*int[] arr = {1, 2, 3, 4};
        System.out.println(getSum(arr));*/
        /*System.out.println(getSum(1.0, 2, 3, 4, 1, 1, 1));
        System.out.println(getSum(1, 2));*/

        //Ambiguous method call: both 'Demo.getSum(double, int...)' and 'Demo.getSum(int, double...)' match
        //getSum(1,2);

    }

    //需求: 求不确定个数的int数值的和 需要使用数组作为形式参数
    //如果我希望能够在填入方法的参数的时候,随意更改参数的个数,怎么办呢?
    //'getSum(int[])' is already defined in 'com.cskaoyan.javase.array._6var.Demo'
    //public static int getSum(int[] arr) {
    //    int sum = 0;
    //    for (int i = 0; i < arr.length; i++) {
    //        sum += arr[i];
    //    }
    //    return sum;
    //}

    //使用可变参数改写方法
    /*public static int getSum(int... arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }
    public static int getSum(double... arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }

    public static int getSum(int a, int b) {
        return a + b;
    }*/

    public static int getSum(double a, int... arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }
    public static int getSum(int a, double... arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }
}
